/*
 * @Author: Suo-Yuheng syh15399227325@163.com
 * @Date: 2025-08-31 17:32:28
 * @LastEditors: Suo-Yuheng syh15399227325@163.com
 * @LastEditTime: 2025-08-31 22:14:36
 * @FilePath: /0831/blockqueue/main.cc
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include "BlockQueue.hpp"
#include <ctime>
#include "task.hpp"
// #include<pthread.h>

void *Consumer(void *args)
{
    BlockQueue<Task> *bq = static_cast<BlockQueue<Task> *>(args);

    while (true)
    {
        // 消费
        Task t = bq->pop(); // 默认的 拷贝构造
        // usleep(1000);
        // sleep(1);

        // 加工数据
        t.Run();
        std::cout << "消费、处理了一个任务： " << t.GetResult() << "  threadid: " << pthread_self() << std::endl;

        // usleep(1000);
    }
}

void *Productor(void *args)
{
    int len = opers.size();
    BlockQueue<Task> *bq = static_cast<BlockQueue<Task> *>(args);

    while (true)
    {

        // int data = rand()%1000 + 1;
        int data1 = rand() % 1000 + 1;
        usleep(1000); // 模拟获取数据花费时间
        int data2 = rand() % 1000 + 1;
        char oper = opers[rand() % len];
        Task t(data1, data2, oper);

        // 生产
        bq->push(t);
        std::cout << "生产了一个任务： " << t.GetTask() << "  threadid: " << pthread_self() << std::endl;
        sleep(1);

        // while(true)
        // {
        //     // sleep(2);   // 生产者一定是 先开始跑、消费者即便先跑、队列初始为空，也要去等待
        //     // 生产
        //     // usleep(1000);
        //     // data++;
        //     bq->push(Task);
        //     std::cout << "生产了一个数据： " << data << std::endl;
        //     sleep(1);
        // }
    }
}

int main()
{
    srand(time(nullptr));
    BlockQueue<Task> *bq = new BlockQueue<Task>();
    pthread_t c[3], p[5];
    for (size_t i = 0; i < 3; i++) // 多消费
    {
        pthread_create(c + i, nullptr, Consumer, bq);
    }

    for (size_t i = 0; i < 5; i++) // 多生产
    {
        pthread_create(p + i, nullptr, Productor, bq);
    }



    for (size_t i = 0; i < 3; i++) // 多消费
    {
        pthread_join(c[i], nullptr);
    }

    for (size_t i = 0; i < 5; i++) // 多生产
    {
        pthread_join(p[i], nullptr);
    }

    delete bq;
    return 0;
}